package com.zhongge.user;

import com.zhongge.book.Library;
import com.zhongge.constant.Constant;
import com.zhongge.utils.InvalidPermissionException;

/**
 * @ClassName ProxyUser
 * @Description TODO 用户代理类
 * @Author zhongge
 * @Version 1.0
 */
@SuppressWarnings("all")
public class ProxyUser {
    //代理AdminUser和NormalUser的方法
    //底层调用的还是AdminUser和NormalUser的方法
    //所以得先有User的实现类对象
    User realUser;//代理类真正要代理的用户

    //书架对象：用于在本类中调用书架中的方法 所以将他聚合在本类中
    Library library;

    public ProxyUser(User realUser) {
        this.realUser = realUser;
        library = Library.getLibraryInstance();//获得library单例对象
    }

    public User getRealUser() {
        return realUser;
    }

    public void setRealUser(User realUser) {
        this.realUser = realUser;
    }


    /**
     * 用户功能的选择
     * @param choice 选择的结果
     * @return
     */
    public void selectionUserFunctions(int choice) {
        //首先进行权限的判断
        if (realUser instanceof AdminUser) {//如果是管理员则有以下权限
            switch (choice) {
                case Constant.SEARCH_BOOK:
                    library.searchBook();
                    break;
                case Constant.DISPLAY_BOOKS:
                    library.displayBooks();
                    break;
                case Constant.EXIT:
                    library.exit();
                    break;
                case Constant.ADD_BOOK:
                    addBook();
                    break;
                case Constant.MODIFY_BOOK:
                    modifyBook();
                    break;
                case Constant.DELETE_BOOK:
                    deleteBook();
                    break;
                case Constant.BORROW_COUNT:
                    borrowCount();
                    break;
                case Constant.POPULAR_BOOK:
                    popularBook();
                    break;
                case Constant.INVENTORY_STATUS:
                    inventoryStatus();
                    break;
                case Constant.CHECK_AND_REMOVE_OLD_BOOKS:
                    checkAndRemoveOldBooks();
                    break;
                default:
                    System.out.println("输入不正确，请重新输入");
                    break;
            }
        } else if (realUser instanceof NormalUser) { //如果是普通用户的话权限如下：
            switch (choice) {
                case Constant.SEARCH_BOOK:
                    library.searchBook();
                    break;
                case Constant.DISPLAY_BOOKS:
                    library.displayBooks();
                    break;
                case Constant.EXIT:
                    library.exit();
                    break;
                case Constant.BORROW_BOOK:
                    borrowBook();
                    break;
                case Constant.RETURN_BOOK:
                    returnBook();
                    break;
                case Constant.VIEW_BORROW_BOOK:
                    viewBorrowBooks();
                    break;
                default:
                    System.out.println("输入不正确，请重新输入");
                    break;
            }
        }
    }
    /**************代理管理员相关方法****************/
    //4.上架图书
    public void addBook() {
        System.out.println("准备上架图书。。。");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有上架图书的权限！！！");//如果权限不够将会抛出异常 使得程序将会终止。
        //如果程序走到这里说明权限合法
        ((AdminUser)realUser).addBook();
    }
    //5.修改图书
    public void modifyBook() {
        System.out.println("进入修改图书功能：");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有修改图书的权限！！！");

        ((AdminUser)realUser).modifyBook();
    }
    //6.下架图书
    public void deleteBook() {
        System.out.println("进入下架图书功能：");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有上架图书的权限！！！");

        ((AdminUser)realUser).deleteBook();
    }
    //7.统计借阅次数
    public void borrowCount() {
        System.out.println("已经进入统计借阅次数功能：");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有上架图书的权限！！！");

        ((AdminUser)realUser).borrowCount();
    }
    //8.查看最受欢迎的前n本书
    public void popularBook() {
        System.out.println("已经进入查看最受欢迎的前n本书的功能：");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有上架图书的权限！！！");

        ((AdminUser)realUser).popularBook();
    }
    //9.查看库存状态
    public void inventoryStatus() {
        System.out.println("已经进入查看库存状态的功能");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有上架图书的权限！！！");

        ((AdminUser)realUser).inventoryStatus();
    }
    //10.检查并移除上架超过一年的书
    public void checkAndRemoveOldBooks() {//检查并移除书籍
        System.out.println("已经进入检查超过一年未下架的图书的功能");
        //判断权限
        judgmentAuthorityOfAdminUser("普通用户没有上架图书的权限！！！");

        ((AdminUser)realUser).checkAndRemoveOldBooks();
    }
    /***********************end********************/

    /**************普通用户相关方法****************/
    //4.借阅图书
    public void borrowBook() {
        System.out.println("已经进入借阅图书的功能");
        //判断权限
        judgmentAuthorityOfNormalUser("请使用普通用户角色进入！！否则没有权限");

        ((NormalUser)realUser).borrowBook();
    }
    //5.归还图书
    public void returnBook() {
        System.out.println("已经进入归还图书的功能");
        //判断权限
        judgmentAuthorityOfNormalUser("请使用普通用户角色进入！！否则没有权限");

        ((NormalUser)realUser).returnBook();
    }
    //6.查看当前个人借阅情况
    public void viewBorrowBooks() {
        System.out.println("已经进入查看当前个人借阅情况的功能");
        //判断权限
        judgmentAuthorityOfNormalUser("请使用普通用户角色进入！！否则没有权限");

        ((NormalUser)realUser).viewBorrowBooks();
    }
    /***********************end******************/

    /********************判断权限*******************/
    /**
     * 判断管理员权限
     * @param msg 异常信息
     */
    private void judgmentAuthorityOfAdminUser(String msg){
        //判断权限
        if (!(realUser instanceof AdminUser)) {
            throw new InvalidPermissionException(msg);
        }
    }

    /**
     * 判断普通用户权限
     * @param msg 异常信息
     */
    private void judgmentAuthorityOfNormalUser(String msg) {
        if (!(realUser instanceof NormalUser)) {
            throw new InvalidPermissionException(msg);
        }
    }
    /**********************end*********************/
}
